昨天提到 escrow,今天就來講一下 self-custody。
使用 cast wallet new
可以產一個新的錢包如下:
Successfully created new keypair.
Address: 0x5DA75D4d0964e5f8B15FDBF7A833F6D93643345a
Private key: 0x8d3307c3fcd7d4257084e87b865ae9e54c0b4ad84146c4c8b98abfa9366f1f40
Private key 就像 Web2 的密碼一樣,只有持有者自己知道,而只要擁有秘密,就能執行這個錢包的所有交易。
但因為這個秘密太難記,輸入的時候也很不方便,使用者體驗差,因此有 mnemonic (seed phrase) 助記詞錢包。
使用 cast wallet new-mnemonic
可以產一個新的註記詞錢包:
Successfully generated a new mnemonic.
Phrase:
space clog try orchard approve camera kiss embody excess maximum junk door
Accounts:
- Account 0:
Address: 0xDd1B639662b5253799624797f23732935a4930B2
Private key: 0xe46f22857cb53786120665b1574d983df49b73d8ecdfa0494d64992f17ca4271
這類型的錢包我們稱作 EOA (Externally Owned Account)。
以智能合約寫成的錢包,叫作 SCA (Smart Contract Account)。
ERC-4337: Account Abstraction Using Alt Mempool 提案在不更動以太坊協議層的前提下,做錢包抽象化的基礎建設。
該提案引進 UserOperation 這個類似交易的物件,用戶要發起鏈上交易時,先把 UserOperation 送到另一個 mempool,Bundler(類似 relayer 的角色)將 mempool 內的 userOps 打包後,呼叫 EntryPoint.sol 的 handleOps
function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant
EntryPoint.sol(必須是一個可信任的合約,目前由 Ethereum 官方團隊開發與部署)的 handleOps
會呼叫用戶 SCA 的 validateUserOp
然後再呼叫 SCA 上的執行函式(函式名稱依 SCA 實作而異,可能是 execute),此時一個用戶發起的交易才算完成。
--
SCA 其中一個好處,是將「驗證權限」與「執行交易」這兩個分開來,因為 EOA 是合在一起的。因此 SCA 可以使用多種方式去驗證交易發起者的權限,例如使用指紋辨識或 FaceID (webauthn 的技術) 來發起交易,或是使用另一個 EOA 來驗證、使用 Google 登入來驗證。
於是許多去中心化應用為了讓更多用戶上車 (onboarding),增加使用者體驗,會在應用中幫用戶創建一個新的 SCA 錢包,用戶可以透過指紋辨識做交易,不需要去記私鑰或註記詞。
這功能很方便,而且能將 Web3 應用更有效地推廣給沒接觸過的人使用,更厲害一點的話,完全不讓用戶知道自己在使用 Web3 的應用。
--
那麼上車的 SCA 用戶要如何確認自己真正擁有某 App 的錢包自主權呢?就是離開(walk away)這個 App,在不使用官方 App 的前提下,能夠向區塊鏈送出任意交易,此時錢包才是真正 self-custodial。
(尚需留意擁有該 SCA 錢包權限的人可能不止一個。)